package Leetcode.每日一题;

/**
 * @Author: kirito
 * @Date: 2024/4/12 20:49
 * @Description:
 * 找到冠军 I
 * 简单
 * 相关标签
 * 相关企业
 * 提示
 * 一场比赛中共有 n 支队伍，按从 0 到  n - 1 编号。
 *
 * 给你一个下标从 0 开始、大小为 n * n 的二维布尔矩阵 grid 。对于满足 0 <= i, j <= n - 1 且 i != j 的所有 i, j ：如果 grid[i][j] == 1，那么 i 队比 j 队 强 ；否则，j 队比 i 队 强 。
 *
 * 在这场比赛中，如果不存在某支强于 a 队的队伍，则认为 a 队将会是 冠军 。
 *
 * 返回这场比赛中将会成为冠军的队伍。
 *
 *
 *
 * 示例 1：
 *
 * 输入：grid = [[0,1],[0,0]]
 * 输出：0
 * 解释：比赛中有两支队伍。
 * grid[0][1] == 1 表示 0 队比 1 队强。所以 0 队是冠军。
 * 示例 2：
 *
 * 输入：grid = [[0,0,1],[1,0,1],[0,0,0]]
 * 输出：1
 * 解释：比赛中有三支队伍。
 * grid[1][0] == 1 表示 1 队比 0 队强。
 * grid[1][2] == 1 表示 1 队比 2 队强。
 * 所以 1 队是冠军。
 *
 *
 * 提示：
 *
 * n == grid.length
 * n == grid[i].length
 * 2 <= n <= 100
 * grid[i][j] 的值为 0 或 1
 * 对于所有 i， grid[i][i] 等于 0.
 * 对于满足 i != j 的所有 i, j ，grid[i][j] != grid[j][i] 均成立
 * 生成的输入满足：如果 a 队比 b 队强，b 队比 c 队强，那么 a 队比 c 队强
 */

public class findChampion {
    /**
     * 0-n个队伍
     * 0    0   1
     * 1    0   1
     * 0    0   0
     * i =>  0-> n-1
     * j     i-> n-1
     *
     * 思路1：
     * 假设冠军当前是2(不能假设，先找到第一轮冠军先,但是可能都比0厉害啊，擦！！！)
     * 直接双重循环，grid[i][j] = 1 且j=2就记录冠军是i  否则继续遍历
     * 因为肯定会存在1  即使是最后一个懂吧
     * 每次遍历判断是否有其他人会获胜
     *
     * 然后我想快一点遍历的话其实可以这么做，假设当前k最大，我就遍历所有的grid[j][k] 如果找到，就替换冠军  继续循环
     *                                                                   否则1就是冠军  返回冠军
     *
     *
     * @param grid
     * @return
     */
    public int findChampion(int[][] grid) {
        int n = grid.length;
        for (int i = 0; i < n; i++) {
            int[] line = grid[i];
            int sum = 0;
            for (int num : line) {
                sum += num;
            }
            if (sum == n - 1) {
                return i;
            }
        }
        return -1;
    }
}
